package busquedas

import scala.collection.mutable.Buffer
import scala.collection.mutable.ArrayBuffer
import aerolineasYVuelos.Aerolinea
import servicios.ServicioVuelo
import aerolineasYVuelos.SessionManager
import aerolineasYVuelos.Vuelo
import scala.collection.JavaConverters._
import scala.collection.JavaConversions._
import java.util.Date
import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.Id
import javax.persistence.GenerationType
import javax.persistence.OneToMany
import javax.persistence.CascadeType
import org.hibernate.annotations._
import aerolineasYVuelosDaos.BusquedaDAO

@Entity
class Busqueda {
	
	@Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    var id: Int = _
    def getId = id
    def setId(i: Int) { id = i }
	
	@OneToMany(cascade = Array(CascadeType.ALL))
	@Fetch(value = FetchMode.SUBSELECT)
	var criterios: java.util.List[CriterioDeBusqueda] = new java.util.ArrayList[CriterioDeBusqueda]
	def getCriterios = criterios
	def setCriterios(cs: java.util.List[CriterioDeBusqueda]) { criterios = cs }
	
	/**
	 * Crea un filtro por origen y destino y se lo guarda en la coleccion de criterios
	 */
	def crearFiltroPorOrigenYDestino(origen: String, destino: String) {
		criterios += new CriterioOrigenDestino(origen, destino)
	}
	
	/**
	 * Crea un filtro por aerolinea y se lo guarda en la coleccion de criterios
	 */
	def crearFiltroPorAerolinea(aerolinea: Aerolinea) {
		criterios += new CriterioAerolinea(aerolinea.getId)
	}
	
	/**
	 * Crea un filtro por hora de salida y se lo guarda en la coleccion de criterios
	 */
	def crearFiltroPorHoraSalida(horaSalida: Date) {
		criterios += new CriterioHoraSalida(horaSalida)
	}
	
	/**
	 * Crea un filtro por hora de llegada y se lo guarda en la coleccion de criterios
	 */
	def crearFiltroPorHoraLlegada(horaLlegada: Date) {
		criterios += new CriterioHoraLlegada(horaLlegada)
	}
	
	/**
	 * Crea el ordenamiento por menos escalas
	 */
	def crearOrdenamientoPorMenosEscalas {
		criterios += new CriterioDeOrdenamientoPorMenosEscalas
	}
	
	/**
	 * Crea el ordenamiento por duracion
	 */
	def crearOrdenamientoPorDuracion {
		criterios += new CriterioDeOrdenamientoPorDuracion
	}
	
	/**
	 * Crea el ordenamiento por precio
	 */
	def crearOrdenamientoPorPrecio {
		criterios += new CriterioDeOrdenamientoPorPrecio
	}
	
	/**
	 * Recorre todos los criterios de la lista de criterios de busqueda y los ejecuta.
	 * Retorna la lista de vuelos que machean con todos los criterios agregados
	 */
	def ejecutarBusqueda: Buffer[Vuelo] = {
	   SessionManager.runInSession[Buffer[Vuelo]] { () =>
		   var criteria = SessionManager.getSession.createCriteria(classOf[Vuelo])
		   criterios.foreach(_.activarFiltro(criteria))
		   criteria.list.asInstanceOf[java.util.List[Vuelo]] 
	   }
	}
}